package ar.com.jsejtman.common.security.schema.entity;

import ar.com.jsejtman.common.domain.entity.Identifiable;
import ar.com.jsejtman.common.domain.entity.IdentifiableComparer;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Version;

/**
 * Dominio (parte/sector) de la aplicación donde un usuario puede realizar una acción.
 * 
 * @author jsejtman
 */
@Entity
@Table(name = "security_security_domain")
public class SecurityDomain implements Identifiable<Long> {

	/**
	 * Identificador del dominio de seguridad.
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private Long id;

	/**
	 * Código del dominio de seguridad.
	 */
	@Column(name = "code", nullable = false)
	private String code;

	/**
	 * Descripción del dominio de seguridad.
	 */
	@Column(name = "description", nullable = false)
	private String description;

	/**
	 * Número de versión de la entidad (para evitar escrituras concurrentes).
	 */
	@Version
	@Column(name = "version", nullable = false)
	private Long version;

	/**
	 * Devuelve el valor de id.
	 * 
	 * @return El valor de id.
	 */
	public final Long getId() {

		return (this.id);
	}

	/**
	 * Asigna un nuevo valor a id.
	 * 
	 * @param id El valor a asignar a id.
	 */
	protected final void setId(final Long id) {

		this.id = id;
	}

	/**
	 * Devuelve el valor de code.
	 * 
	 * @return El valor de code.
	 */
	public final String getCode() {

		return (this.code);
	}

	/**
	 * Asigna un nuevo valor a code.
	 * 
	 * @param code El valor a asignar a code.
	 */
	public final void setCode(final String code) {

		this.code = code;
	}

	/**
	 * Devuelve el valor de description.
	 * 
	 * @return El valor de description.
	 */
	public final String getDescription() {

		return (this.description);
	}

	/**
	 * Asigna un nuevo valor a description.
	 * 
	 * @param description El valor a asignar a description.
	 */
	public final void setDescription(final String description) {

		this.description = description;
	}

	/**
	 * Devuelve el valor de version.
	 * 
	 * @return El valor de version.
	 */
	protected final Long getVersion() {

		return (this.version);
	}

	/**
	 * Asigna un nuevo valor a version.
	 * 
	 * @param version El valor a asignar a version.
	 */
	protected final void setVersion(final Long version) {

		this.version = version;
	}

	@Override
	public final int hashCode() {

		return ((this.id == null) ? 0 : this.id.hashCode());
	}

	@SuppressWarnings("unchecked")
	@Override
	public final boolean equals(final Object obj) {

		return (IdentifiableComparer.equals(this, (Identifiable<Serializable>) obj));
	}
}
